#ifndef _QUEUE_LINK_H_
#define _QUEUE_LINK_H_

template <class T>
class Stack {
public:
    Stack(){}; // 构造函数
    void Push(const T x) = 0; // 新元素进栈
    bool Pop() = 0; // 栈顶元素出栈
    virtual bool getTop(T &x) const = 0; // 读取栈顶元素，由x返回
    virtual bool isEmpty() const = 0; // 判断栈空否
    virtual bool isFull() const = 0; // 判断栈满否
    virtual int getSize() const = 0; // 计算栈中元素个数
};


template <class T>
struct LinkNode 
{
    T data;
    LinkNode<T> *link;
};
 
 
template <class T>
class LinkedStack: public Stack<T> 
{
public:
    LinkedStack(); // 构造函数
    ~LinkedStack();// 析构函数
    void Push(const T x); // 进栈
    bool Pop(); // 出栈
    bool getTop(T &x) const; // 读取栈顶元素
    bool isEmpty()const; // 判断栈是否为空
    int getSize()const; // 求栈的元素个数
    void clear(); // 清空栈的内容
    friend ostream& operator << <T>(ostream& out, LinkedStack<T>& s); // 重载输出函数
private:
    LinkNode<T> *top; // 栈顶指针，即链头指针
};

//友元函数的声明
template <class T>
ostream& operator<<(ostream& out, LinkedStack<T>& s);
 


#endif
